package com.wanglianyun.handler;

import com.wanglianyun.request.Address;
import com.wanglianyun.request.Company;
import com.wanglianyun.request.User;
import org.springframework.util.Assert;

import java.util.Optional;

/**
 * Description: java中对象判断处理
 * Copyright: Copyright (c) 2024
 * Create Time: 2024-11-16 09:48
 *
 * @author wanglianyun
 */
public class OptionalHandler {

    public String getCountryByOptionalOrElse(User user) {
        //map(Function<T, U> mapper)
        //如果当前optional不为空则将optional中的对象T映射另外一个对象U，并将U存放到一个新的optional容器中并返回，否则返回空的optional
        return Optional.ofNullable(user)
                .map(User::getCompany)
                .map(Company::getAddress)
                .map(Address::getCountry)
                .orElse(getOtherCountry());
    }

    public String getCountryByOptionalOrElseGet(User user) {
        //只有前面Optional为空时才会走到orElseGet
        return Optional.ofNullable(user)
                .map(User::getCompany)
                .map(Company::getAddress)
                .map(Address::getCountry)
                .orElseGet(this::getOtherCountry);
    }

    private String getOtherCountry() {
        System.out.println("我运行啦");
        //使用orElse时候有个问题，如果orElse里传入的是函数的话不管Optional操作是否有问题每次都会运行getOtherCountry(),
        //如果该方法里是数据库操作的话就会出问题，会执行数据库的操作会导致数据库数据异常，可以使用orElseGet来解决
        return "China";
    }

    // 断言处理
    public String getCountryByAssert(User user) {
        Assert.notNull(user, "user对象不能为空");
        Company company = user.getCompany();
        Assert.notNull(company, "company对象不能为空");
        Address address = company.getAddress();
        Assert.notNull(address, "address不能为空");

        return address.getCountry();
    }
}
